#include "./../inc/main.h"

/* 主界面 */

MainPage::MainPage()
{
    // 初始化主页面按钮
    mainButtons = {
        {200, 100, 400, 80, "单人模式", ShowFont::darkSlateGray, ShowFont::white},
        {200, 220, 400, 80, "网络对战", ShowFont::darkSlateGray, ShowFont::white},
        {200, 340, 400, 80, "人机对战", ShowFont::darkSlateGray, ShowFont::white}};
}

void MainPage::display(Lcd *lcd)
{
    int *buffer = lcd->getBuffer();
    if (buffer == nullptr)
        return;

    for (int y = 0; y < LCD_HEIGHT; y++)
    {
        for (int x = 0; x < LCD_WIDTH; x++)
        {
            buffer[LCD_WIDTH * y + x] = 0xFFFFFF; // 白色
        }
    }

    // 绘制所有按钮
    for (const auto &btn : mainButtons)
    {
        drawButton(lcd, btn);
    }

    lcd->swapBuffers();
}

GameMode MainPage::handleTouch(Touch *touch, Lcd *lcd)
{
    Point touchPoint;
    touch->wait(touchPoint);

    // 检查触摸点是否在某个按钮内
    for (size_t i = 0; i < mainButtons.size(); ++i)
    {
        if (isPointInButton(touchPoint, mainButtons[i]))
        {
            switch (i)
            {
            case 0:
                return SinglePlayer;
            case 1:
                return NetworkGame;
            case 2:
                return AiGame;
            default:
                return None;
            }
        }
    }
    return None;
}

void MainPage::drawButton(Lcd *lcd, const Button &btn)
{
    int *buffer = lcd->getBuffer();
    if (buffer == nullptr)
        return;

    // 绘制圆角按钮背景
    BMP::drawRoundRectangle(
        buffer,
        btn.x, btn.y,                          // 左上角坐标
        btn.x + btn.width, btn.y + btn.height, // 右下角坐标
        btn.bgColor,                           // 填充色
        15,                                    // 圆角半径
        ShowFont::gold,                        // 边框色
        2                                      // 边框宽度
    );

    // 计算文字居中坐标

    int fontSize = 24;
    int charWidth = fontSize;      // 单字符宽度
    int charHeight = fontSize + 8; // 单字符高度
    int textLen = btn.text.size(); // 文字长度

    // 文字总宽度
    int totalTextWidth = charWidth * textLen;
    // 文字总高度
    int totalTextHeight = charHeight;

    // 居中坐标
    int textX = btn.x + (btn.width - totalTextWidth) / 2;
    int textY = btn.y + (btn.height - totalTextHeight) / 2;

    // 居中文字
    char *text = const_cast<char *>(btn.text.c_str());
    ShowFont::instance()->display(
        text,
        fontSize,        // 字体大小
        totalTextWidth,  // 文字区域宽度
        totalTextHeight, // 文字区域高度
        btn.bgColor,     // 文字背景色
        btn.textColor,   // 文字颜色
        textX, textY     // 居中后的坐标
    );
}

bool MainPage::isPointInButton(const Point &p, const Button &btn)
{
    int x = p.x();
    int y = p.y();
    return (x >= btn.x && x <= btn.x + btn.width &&
            y >= btn.y && y <= btn.y + btn.height);
}